home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / MacHacksBug / Python 1.5.2c1 / Extensions / Imaging / PIL / PsdImagePlugin.py < prev    next >
Encoding:
Text File  |  2000-06-23  |  2.6 KB  |  136 lines

  1. #
  2. # The Python Imaging Library.
  3. # $Id: PsdImagePlugin.py,v 1.1.1.1 1998/08/18 13:07:53 sjoerd Exp $
  4. #
  5. # Adobe PSD 2.5/3.0 file handling
  6. #
  7. # History:
  8. #    95-09-01 fl    Created
  9. #    97-01-03 fl    Read most PSD images
  10. #    97-01-18 fl    Fixed P and CMYK support
  11. #
  12. # Copyright (c) Secret Labs AB 1997.
  13. # Copyright (c) Fredrik Lundh 1995-97.
  14. #
  15. # See the README file for information on usage and redistribution.
  16. #
  17.  
  18. __version__ = "0.3"
  19.  
  20. import string
  21. import Image, ImageFile, ImagePalette
  22.  
  23.  
  24. MODES = {
  25.     0:"1",
  26.     1:"L",
  27.     2:"P",
  28.     3:"RGB",
  29.     4:"CMYK",
  30.     7:"MLS",
  31.     8:"L",
  32.     9:"LAB"
  33. }
  34.  
  35. #
  36. # helpers
  37.  
  38. def i16(c):
  39.     return ord(c[1]) + (ord(c[0])<<8)
  40.  
  41. def i32(c):
  42.     return ord(c[3]) + (ord(c[2])<<8) + (ord(c[1])<<16) + (ord(c[0])<<24)
  43.  
  44. # --------------------------------------------------------------------.
  45. # read PSD images
  46.  
  47. def _accept(prefix):
  48.     return prefix[:4] == "8BPS"
  49.  
  50. class PsdImageFile(ImageFile.ImageFile):
  51.  
  52.     format = "PSD"
  53.     format_description = "Adobe Photoshop"
  54.  
  55.     def _open(self):
  56.  
  57.     #
  58.     # header
  59.  
  60.     s = self.fp.read(26)
  61.     if s[:4] != "8BPS" or i16(s[4:]) != 1:
  62.         raise SyntaxError, "not a PSD file"
  63.  
  64.     bits, layers = i16(s[22:]), i16(s[12:])
  65.  
  66.     self.mode = MODES[i16(s[24:])]
  67.     if self.mode == "MLS":
  68.         self.mode = string.uppercase[:layers] + "*8"
  69.  
  70.     self.size = i32(s[18:]), i32(s[14:])
  71.  
  72.     #
  73.     # mode data
  74.  
  75.     size = i32(self.fp.read(4))
  76.     if size:
  77.         data = self.fp.read(size)
  78.         if self.mode == "P" and size == 768:
  79.         self.palette = ImagePalette.raw("RGB;L", data)
  80.  
  81.     #
  82.     # resources
  83.  
  84.     size = i32(self.fp.read(4))
  85.     if size:
  86.         self.fp.seek(size, 1) # ignored
  87.  
  88.     #
  89.     # reserved block (overlays?)
  90.  
  91.     size = i32(self.fp.read(4))
  92.     if size:
  93.         self.fp.seek(size, 1) # ignored
  94.  
  95.     #
  96.     # image descriptor
  97.  
  98.     self.tile = []
  99.  
  100.     compression = i16(self.fp.read(2))
  101.  
  102.     if compression == 0:
  103.  
  104.         #
  105.         # raw compression
  106.  
  107.         offset = self.fp.tell()
  108.         for layer in self.mode:
  109.         if self.mode == "CMYK":
  110.             layer = layer + ";I"
  111.         self.tile.append(("raw", (0,0)+self.size, offset, layer))
  112.         offset = offset + self.size[0]*self.size[1]
  113.  
  114.     elif compression == 1:
  115.  
  116.         #
  117.         # packbits compression
  118.  
  119.         i = 0
  120.         s = self.fp.read(layers * self.size[1] * 2) # byte counts
  121.         offset = self.fp.tell()
  122.         for layer in self.mode:
  123.         if self.mode == "CMYK":
  124.             layer = layer + ";I"
  125.         self.tile.append(("packbits", (0,0)+self.size, offset, layer))
  126.         for y in range(self.size[1]):
  127.             offset = offset + i16(s[i:i+2])
  128.             i = i + 2
  129.  
  130. # --------------------------------------------------------------------
  131. # registry
  132.  
  133. Image.register_open("PSD", PsdImageFile, _accept)
  134.  
  135. Image.register_extension("PSD", ".psd")
  136.